#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define BUFFER_SIZE 10  // 缓冲区大小

int buffer[BUFFER_SIZE];  // 缓冲区数组
int count = 0;  // 当前缓冲区中的元素数量

pthread_mutex_t mutex;  // 互斥锁，用于保护共享资源
pthread_cond_t cond_producer;  // 条件变量，用于通知生产者
pthread_cond_t cond_consumer;  // 条件变量，用于通知消费者

void* producer(void* arg) {
    for (int i = 0; i < 20; i++) {
        pthread_mutex_lock(&mutex);  // 锁定互斥锁

        // 如果缓冲区已满，则等待条件变量通知
        while (count == BUFFER_SIZE) {
            pthread_cond_wait(&cond_producer, &mutex);
        }

        buffer[count++] = i;  // 生产一个产品，放入缓冲区
        printf("Produced: %d\n", i);

        pthread_cond_signal(&cond_consumer);  // 通知消费者有新的产品
        pthread_mutex_unlock(&mutex);  // 释放互斥锁
    }
    return NULL;
}

void* consumer(void* arg) {
    for (int i = 0; i < 20; i++) {
        pthread_mutex_lock(&mutex);  // 锁定互斥锁

        // 如果缓冲区为空，则等待条件变量通知
        while (count == 0) {
            pthread_cond_wait(&cond_consumer, &mutex);
        }

        int item = buffer[--count];  // 消费一个产品，从缓冲区取出
        printf("Consumed: %d\n", item);

        pthread_cond_signal(&cond_producer);  // 通知生产者有空位
        pthread_mutex_unlock(&mutex);  // 释放互斥锁
    }
    return NULL;
}

int main() {
    pthread_t prod, cons;

    // 初始化互斥锁和条件变量
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond_producer, NULL);
    pthread_cond_init(&cond_consumer, NULL);

    // 创建生产者线程和消费者线程
    pthread_create(&prod, NULL, producer, NULL);
    pthread_create(&cons, NULL, consumer, NULL);

    // 等待生产者线程和消费者线程完成
    pthread_join(prod, NULL);
    pthread_join(cons, NULL);

    // 销毁互斥锁和条件变量
    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond_producer);
    pthread_cond_destroy(&cond_consumer);

    return 0;
}

